
// step 1# 定义宏函数，用于取两个整数的最大值
#define MAX(a, b) ((b) > (a) ? (b) : (a))

// step 2# 主函数：寻找不含重复字符的最长子串长度
int lengthOfLongestSubstring(char* s) {
    int ans = 0;              // 最长子串长度
    int left = 0;             // 窗口左边界（滑动窗口左指针）
    int cnt[128] = {};        // 用于统计每个字符出现次数（ASCII字符共128种）

    // step 3# 使用右指针遍历字符串
    for (int right = 0; s[right]; right++) {
        char c = s[right];    // 当前字符
        cnt[c]++;             // 当前字符计数加一

        // step 3.1# 若窗口中该字符已重复，需缩小左边界
        while (cnt[c] > 1) {        
            cnt[s[left]]--;   // 移除左端字符
            left++;           // 左指针右移，缩小窗口
        }

        // step 3.2# 更新最大子串长度
        ans = MAX(ans, right - left + 1);
    }

    // step 4# 返回结果
    return ans;
}
